package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.dto.TabDto;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.business.dto.response.GoodsSalesStatisticsBizDto;
import com.molichuxing.services.business.dto.response.OrderCarInfoAppDto;
import com.molichuxing.services.infrastructure.dto.request.create.OrderExclusivelCreateDto;
import com.molichuxing.services.infrastructure.dto.request.modify.OrderDeliveryModifyDto;
import com.molichuxing.services.infrastructure.dto.request.modify.OrderPayModifyDto;
import com.molichuxing.services.infrastructure.dto.response.OrderExclusivelDto;
import com.molichuxing.services.property.OrderExclusivelStatusEnum;
import com.molichuxing.services.property.OrderListTypeEnum;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 专属里程订单基础服务
 *
 * @author zoumingyu
 * @date 2019年8月13日
 */
public interface OrderExclusivelService extends RootService {

    /**
     * 专属里程订单信息
     *
     * @param orderCode
     * @return
     */
    OrderExclusivelDto getOrderExclusivel(Long orderCode);

    Map<Long, OrderExclusivelDto> getOrderExclusivel(List<Long> orderCodes);

    /**
     * 分页获取专属里程订单信息
     *
     * @param params   listType：列表类型-enum <br/>
     *                 orderStatus：订单状态-enum <br/>
     *                 orderCode：订单号-long <br/>
     *                 userIds：用户id-list <br/>
     *                 storeIds：门店id-list <br/>
     *                 orderTimeStart：下单开始时间-LocalDateTime <br/>
     *                 orderTimeEnd：下单结束时间-LocalDateTime
     * @param pageNum  页数
     * @param pageSize 每页条数
     * @return
     * @throws Exception
     */
    Paged<OrderExclusivelDto> getOrderList(Map<String, Object> params, int pageNum, int pageSize)
            throws Exception;

    /**
     * 根据用户id查询专属里程订单信息
     *
     * @param userId 用户id
     * @return
     */
    List<OrderExclusivelDto> getOrderListByUser(Integer userId);

    /**
     * 根据用户id查询有效订单（未取消、未删除）
     *
     * @param userId 用户id
     * @return
     */
    List<OrderExclusivelDto> getNormalByUser(Integer userId);

    /**
     * 根据车辆id查询专属里程订单信息
     *
     * @param carId 车辆id
     * @return
     */
    List<OrderExclusivelDto> getOrderListByCar(Integer carId);

    /**
     * 根据车辆id查询专属里程订单信息
     *
     * @param carId    车辆id
     * @param storeIds 门店ids
     * @return
     */
    List<OrderExclusivelDto> getOrderListByCar(Integer carId, List<Integer> storeIds);

    /**
     * 统计每种状态下的数据量
     *
     * @param orderListType 列表类型枚举
     * @return
     */
    List<TabDto> getStatusStatistics(OrderListTypeEnum orderListType);

    /**
     * 统计每种状态下的数据量
     *
     * @param orderListType 列表类型枚举
     * @param storeIds      门店ids
     * @return
     */
    List<TabDto> getStatusStatistics(OrderListTypeEnum orderListType, List<Integer> storeIds);

    /**
     * 根据用户id查询订单号
     *
     * @param userId 用户id
     * @return
     */
    List<Long> getOrderCodeByUser(Integer userId);

    /**
     * 根据用户id查询订单号
     *
     * @param userIds 用户id
     * @return
     */
    List<Long> getOrderCodeByUser(List<Integer> userIds);

    /**
     * 根据门店id查询订单号
     *
     * @param storeIds 门店id
     * @return
     */
    List<Long> getOrderCodeByStores(List<Integer> storeIds);

    /**
     * 查询用户下的车辆id
     *
     * @param userId
     * @return
     */
    List<OrderCarInfoAppDto> getUseCarIdByUser(Integer userId, Integer orderStatus);

    /**
     * 新增专属订单
     *
     * @param createDto
     * @return id
     */
    Integer create(OrderExclusivelCreateDto createDto);

    /**
     * 订单状态修改
     *
     * @param orderCode      订单号
     * @param preOrderStatus 修改前状态
     * @param orderStatus    修改后状态
     * @return
     */
    boolean modify(Long orderCode, OrderExclusivelStatusEnum preOrderStatus,
                   OrderExclusivelStatusEnum orderStatus);

    /**
     * 支付完成修改专属订单
     *
     * @param modifyDto
     * @return
     */
    Boolean modifyPay(OrderPayModifyDto modifyDto);

    /**
     * 统计排序订单商品销量
     *
     * @return
     */
    List<Map<String, Object>> getStatisticsGoods();

    /**
     * 提车完成修改专属订单
     *
     * @param modifyDto
     * @return
     */
    Boolean modifyDelivery(OrderDeliveryModifyDto modifyDto);


    /**
     * 专属订单待审核
     *
     * @return
     */
    Integer getOrderExclusivelPendCount();


    /**
     * 专属超时未还车数量
     */
    Integer getExclusivelOvertimeCount();

    /**
     * 查询最近N天，每天的专属数量
     *
     * @param days
     * @return
     */
    Map<String, Integer> getExclusivelCountByDay(Integer days);


    /**
     * 查询N天前的专属订单数量
     *
     * @return
     */
    Integer getExclusivelYesterdayCount(Integer days);

    /**
     * 查询专属订单中所有用车中的
     *
     * @return
     */
    List<OrderExclusivelDto> getExclusivelTradeUse();

    /**
     * 查询专属订单信息
     *
     * @param payDate     支付日期
     * @param orderStatus 订单状态
     * @return
     */
    List<OrderExclusivelDto> getExclusivel(LocalDate payDate, OrderExclusivelStatusEnum orderStatus);

    /**
     * 查询当天支付成功的
     *
     * @return
     */
    List<LocalDateTime> getTodayExclusiveCount();

    /**
     * 查询统计每种车型已提车的专属订单
     *
     * @return
     */
    Map<Integer, Integer> getEffectiveOrderVehicleStatistics();

    /**
     * 查询统计每个门店已提车的专属订单
     *
     * @return
     */
    Map<Integer, Integer> getEffectiveOrderStoreStatistics();

    /**
     * 查询统计每种商品已支付的专属订单
     *
     * @return
     */
    List<GoodsSalesStatisticsBizDto> getEffectiveOrderGoodsStatistics();
}
